home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 21 / Cream of the Crop 21 (Terry Blount) (October 1996).iso / os2 / freetype.zip / raster.pas < prev    next >
Pascal/Delphi Source File  |  1996-09-07  |  44KB  |  1,812 lines

  1. {***************************************************************************}
  2. {*                                                                         *}
  3. {*    The Portable TrueType Engine - Copyright 1996 David TURNER           *}
  4. {*_________________________________________________________________________*}
  5. {*                                                                         *}
  6. {* Unit RASTER.PAS                                                         *}
  7. {*                                                                         *}
  8. {*  This unit is in charge of the final scanlin conversion to a bitmap     *}
  9. {*                                                                         *}
  10. {*  XXX : Cette version est sécurisée et fournit un sub-banding efficace   *}
  11. {*                                                                         *}
  12. {*        Reste à retirer la limite de 64(up)+64(down) profils simultanés  *}
  13. {*        ( Astuce : Calculer la taille des tables de tracé en fin de      *}
  14. {*                   parcours.. )                                          *}
  15. {*                                                                         *}
  16. {***************************************************************************}
  17.  
  18. Unit RASTER;
  19.  
  20. interface
  21.  
  22. {$DEFINE DEBUG}    (* Affiche par writeln les erreurs fatales du raster *)
  23.  
  24. { $DEFINE DEBUG2}  (* Trace le bloc inverse en fin de render *)
  25. { $DEFINE DEBUG3}  (* Trace les pixels pendant le render *)
  26. { $DEFINE DEBUG4}  (* Trace les profils plutôt que les pleins *)
  27.  
  28. {$DEFINE REVERSE} (* Autorise l'affichage des glyphes dont l'orientation *)
  29.                   (* est erronnée                                        *)
  30.  
  31. { $DEFINE CALCUL}
  32.  
  33. uses TTTypes,
  34.      TTCalc,
  35.      TTDisp;   (* This one only for debugging purpose *)
  36.  
  37. const
  38.   TTFlowDown  = -1; (* Indique un bitmap orienté de haut en bas *)
  39.   TTFlowUp    =  1; (* Indique un bitmap orienté de bas en haut *)
  40.   TTFlowError =  0; (* Indique une erreur lors du calcul        *)
  41.  
  42.   Err_Ras_None       =  0;
  43.   Err_Ras_NotIni     = -2;  { Rasterizer not Initialized   }
  44.   Err_Ras_Overflow   = -3;  { Profile Table Overflow       }
  45.   Err_Ras_Neg_H      = -4;  { Negativ Height encountered ! }
  46.   Err_Ras_Invalid    = -5;  { Invalid value encountered !  }
  47.  
  48.   TTDropOutControlNone     = 0;  { No Drop-out control                 }
  49.   TTDropOutControlSimple   = 1;  { Simple Drop-out control ( rule #3 ) }
  50.   TTDropOutControlComplex  = 2;  { Sophisticated control ( rule #4 )   }
  51.  
  52. type
  53.  
  54.   (* Cette structure permet de décrire le type du BitMap où seront  *)
  55.   (* rendus les glyphes                                             *)
  56.  
  57.   PRasterBlock = ^TRasterBlock;
  58.   TRasterBlock = record
  59.                    Rows   : ULong;        (* Nombre de lignes du bloc    *)
  60.                    Cols   : ULong;        (* Nombre de colonnes du bloc  *)
  61.                    Width  : ULong;        (* Nombre de pixels/ligne      *)
  62.                    Flow   : LongInt;      (* Définit l'orientation du    *)
  63.                                           (* bitmap                      *)
  64.                    Buffer : Pointer;      (* Pointeur vers le Buffer     *)
  65.                    Size   : ULong;        (* Taille du buffer            *)
  66.                  end;
  67.  
  68.  
  69.   (* Cette structure permet de décrire au rasterizer le glyphe que nous  *)
  70.   (* voulons rendre dans le BitMap                                       *)
  71.  
  72.   PGlyphRecord = ^TGlyphRecord;
  73.   TGlyphRecord = record
  74.                    Outlines  : ULong;      (* Nombre de contours du glyphe *)
  75.                    OutStarts : Pointer;    (* Indices de début de chaque   *)
  76.                                            (* contour                      *)
  77.                    Points    : ULong;      (* Nombre de points             *)
  78.                    XCoord    : Pointer;    (* Tableau des abscisses        *)
  79.                    YCoord    : Pointer;    (* Tableau des ordonnées        *)
  80.                    Flag      : Pointer;    (* Tableau des flags            *)
  81.                   end;
  82.  
  83. var
  84.   Rast_Err : Int;
  85.  
  86. function InitRasterizer( var rasterBlock : TRasterBlock;
  87.                              profBuffer  : PStorage;
  88.                              profSize    : ULong
  89.                         )
  90.                         : Int;
  91.  
  92. function RenderGlyph( var AGlyph : TGlyphRecord;
  93.                           xmax,
  94.                           ymax   : Int
  95.                     ) : boolean;
  96.  
  97. implementation
  98.  
  99.  
  100. const
  101.   MaxBezier  = 32;       (* Le nombre maximum de sous-arcs de Bezier *)
  102.   MaxProfils = 256;      (* Le nombre maximum de profils d'un glyphe *)
  103.  
  104.   Precision  = 64;               (* Precision sur 6 bits         *)
  105.   Precision2 = Precision div 2;  (* La moitié de notre précision *)
  106.  
  107.  
  108. type
  109.  
  110.   TEtats  = ( Indetermine, Ascendant, Descendant, Plat, Rupture );
  111.  
  112.   PTraceRec = ^TTraceRec;
  113.  
  114.   PProfil = ^TProfil;
  115.   TProfil = record
  116.               Flow   : Int;       (* Profil montant ou descendant  *)
  117.               Height : Int;       (* Hauteur du profil             *)
  118.               Start  : Int;       (* ordonnée de départ du profil  *)
  119.               Offset : ULong;     (* Offset de début du profil     *)
  120.  
  121.               Link   : PProfil;   (* Prochain profil de la liste   *)
  122.               Index  : Int;       (* Index dans le teableau de     *)
  123.                                   (* tracé                         *)
  124.               CountL : Int;       (* Nombre de lignes à compléter  *)
  125.                                   (* avant le début du tracé de    *)
  126.                                   (* ce profil                     *)
  127.               StartL : Int;       (* Première ligne du tracé       *)
  128.               Trace  : PTraceRec; (* Pointeur sur le tracé utilisé *)
  129.             end;
  130.  
  131.  
  132.   TBand = record
  133.             Y_Min : Int;
  134.             Y_Max : Int;
  135.           end;
  136.  
  137.   TTraceElement = record
  138.                    Profil : PProfil;   (* Profil de cette abscisse       *)
  139.                    X      : LongInt;   (* Abscisse sur la ligne courante *)
  140.                   end;
  141.  
  142.   PTraceArray = ^TTraceArray;
  143.   TTraceArray = Array[0..127] of TTraceElement;
  144.  
  145.   TTraceRec = record
  146.                N : Int;
  147.                T : PTraceArray;
  148.               end;
  149.  
  150.  
  151. const
  152.   AlignProfileSize = ( sizeOf(TProfil) + 3 ) div 4;
  153.   AlignTraceSize   = ( sizeOf(TTraceRec) + 3 ) div 4;
  154.  
  155. var
  156.   cProfil  : PProfil;    (* Profil Courant *)
  157.   fProfil  : PProfil;    (* Tête de la liste chaînée des profils *)
  158.   oProfil  : PProfil;    (* Old Profile                          *)
  159.   gProfil  : PProfil;    (* Last Profile in case of impact       *)
  160.  
  161.   nProfs   : Int;        (* Nombre courant de profils *)
  162.  
  163.   Etat     : TEtats;       (* Etat du trace *)
  164.  
  165.   Fresh    : Boolean;      (* Indique un profil neuf dont le champ 'START' *)
  166.                            (* doit être complété                           *)
  167.  
  168.   Joint    : Boolean;      (* Indique que le dernier arc est tombé pile
  169.                               sur une scanLine. Evite les doublons *)
  170.  
  171.   Buff     : PStorage;     (* Buffer Profils              *)
  172.   MaxBuff  : ULong;        (* Taille du buffer            *)
  173.   profCur  : ULong;        (* Curseur du Buffer Profils   *)
  174.  
  175.   Cible      : TRasterBlock; (* Description du Bitmap cible *)
  176.  
  177.   BCible     : PByteArray;   (* Buffer bitmap cible *)
  178.  
  179.   Band_Stack : array[1..16] of TBand;
  180.   Band_Top   : Int;
  181.  
  182.   Trace_Left,
  183.   Trace_Right : TTraceRec;
  184.  
  185.   TraceOfs : Int;      (* Offset courant du tracé dans le bitmap  *)
  186.   DebugOfs : Int;      (* Offset écrant pour le débogage du tracé *)
  187.  
  188.   Arcs     : Array[0..2*MaxBezier] of
  189.               record                   (* La pile de points qui permet  *)
  190.                X, Y : LongInt          (* de travailler sur les arcs de *)
  191.               end;                     (* Bézier                        *)
  192.  
  193.   CurArc   : Int;                      (* Taille de la pile             *)
  194.  
  195.   XCoord,
  196.   YCoord   : PStorage;
  197.  
  198.   Flags    : PByteArray;
  199.   Outs     : PShortArray;
  200.  
  201.   nPoints,
  202.   nContours : Int;
  203.  
  204.   LastX,
  205.   La